import logging
import sys
import os
from logging.handlers import RotatingFileHandler
from datetime import datetime

# 创建日志目录
log_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'logs')
os.makedirs(log_dir, exist_ok=True)

# 生成日志文件名（包含日期）
log_file = os.path.join(log_dir, f'frame_analyzer_{datetime.now().strftime("%Y%m%d")}.log')

# 创建日志记录器
logger = logging.getLogger('frame_analyzer')
logger.setLevel(logging.DEBUG)

# 创建控制台处理器
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.INFO)  # 控制台只显示INFO及以上级别

# 创建文件处理器，使用RotatingFileHandler进行日志滚动
file_handler = RotatingFileHandler(
    log_file,
    maxBytes=10*1024*1024,  # 10MB
    backupCount=10,
    encoding='utf-8'
)
file_handler.setLevel(logging.WARNING)  # 修改为只记录WARNING级别以上的日志到文件

# 创建详细的格式化器
detailed_formatter = logging.Formatter(
    '%(asctime)s - %(name)s - [%(levelname)s] - %(filename)s:%(lineno)d - %(funcName)s() - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'  # 修改时间格式，移除毫秒
)

# 创建简单的格式化器（用于控制台）
simple_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

# 设置格式化器
console_handler.setFormatter(simple_formatter)
file_handler.setFormatter(detailed_formatter)

# 添加处理器到日志记录器
logger.addHandler(console_handler)
logger.addHandler(file_handler)

# 创建一个过滤器，用于过滤INFO级别的日志
class InfoLevelFilter(logging.Filter):
    def __init__(self, redirect_to_ui=False):
        super().__init__()
        self.redirect_to_ui = redirect_to_ui
    
    def filter(self, record):
        # 如果启用了重定向，且日志级别为INFO，不允许输出到文件
        if self.redirect_to_ui and record.levelno == logging.INFO:
            return False
        return True

# 初始化过滤器
info_filter = InfoLevelFilter()
file_handler.addFilter(info_filter)

def set_info_redirect_mode(redirect_to_ui=False):
    """控制INFO级别日志的输出目标
    
    Args:
        redirect_to_ui: 如果为True，INFO级别的日志仅输出到界面，不写入文件
                        如果为False，INFO级别的日志同时输出到界面和文件
    """
    info_filter.redirect_to_ui = redirect_to_ui
    logger.debug(f"INFO日志重定向模式已设置为: {'仅界面' if redirect_to_ui else '界面和文件'}")

# 初始化时自动启用仅UI显示模式
set_info_redirect_mode(True)

# 记录启动信息
logger.warning("=== 成帧数据分析软件启动 ===")
logger.warning("日志文件位置: %s", log_file)
logger.debug("日志系统初始化完成") 